package org.example.netty.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

import java.util.List;

/**
 * 自定义字节转Protobuf对象
 */
public class CustomProtobufDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 魔数，版本号，长度
        // 先mark一下
        in.markReaderIndex();
        if (in.readableBytes() < 4) {
            return;
        }
        // 先读魔数
        int magic = in.readInt();
        // 读版本号
        if (in.readableBytes() < 4) {
            // 还原读的位置
            in.resetReaderIndex();
            return;
        }
        // 在读版本
        int version = in.readInt();

        // 读内容长度
        if (in.readableBytes() < 4) {
            in.resetReaderIndex();
            return;
        }
        int contentLength = in.readInt();
        if (in.readableBytes() < contentLength) {
            in.resetReaderIndex();
            return;
        }

        // 此处有读到内存的性能问题，考虑零拷贝
        // 可以读取内容了
        byte[] contents = new byte[contentLength];
        in.readBytes(contents);
        ByteBuf buf = Unpooled.buffer();
        buf.writeBytes(contents);
        out.add(buf);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("测试EventExecutorGroup", CharsetUtil.UTF_8));
    }
}
